package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.*;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.service.cargo.ExportProductService;
import cn.itcast.service.cargo.ExportService;
import cn.itcast.vo.ExportProductVo;
import cn.itcast.vo.ExportResult;
import cn.itcast.vo.ExportVo;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import org.apache.cxf.jaxrs.client.WebClient;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.ArrayList;
import java.util.List;

@Controller
@RequestMapping("/cargo/export")
public class ExportController extends BaseController {


	@Reference
	private ContractService contractService;

	@Reference
	private ExportService exportService;

	@Reference
	private ExportProductService exportProductService;

	/**
	 * 分页查询
	 */
	@RequestMapping("/contractList")
	public String contractList(@RequestParam(defaultValue = "1") int page,
	                   @RequestParam(defaultValue = "10") int size) {

		//1.调用service查询
		//i.实例化example对象
		ContractExample example = new ContractExample();
		//ii.根据example创建Criteria对象
		ContractExample.Criteria criteria = example.createCriteria();
		//iii.设置查询条件   and + 属性 + 查询方式（参数）
		criteria.andCompanyIdEqualTo(getLoginCompanyId());
		//查询所有状态=1的购销合同
		criteria.andStateEqualTo(1);
		example.setOrderByClause("create_time DESC");
		//iiii.发起调用
		PageInfo info = contractService.findAll(example, page, size);
		//2.将数据保存到request
		request.setAttribute("page",info);
		//3.跳转页面
		return "cargo/export/export-contractList";
	}


	//分页查询报运单数据列表
	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") int page,
	                   @RequestParam(defaultValue = "10") int size) {

		ExportExample example = new ExportExample();
		ExportExample.Criteria criteria = example.createCriteria();
		criteria.andCompanyIdEqualTo(getLoginCompanyId());

		PageInfo info = exportService.findAll(example, page, size);

		request.setAttribute("page",info);

		return "cargo/export/export-list";
	}

	/**
	 * 进入保存页面
	 *  参数：勾选的保运单ID
	 *      页面传递了同名参数id：
	 *          在springmvc中可以转化为String数组 ： String [] id;
	 *          在springmvc中可以转化为String字符串： String id （多个id之间以“，”分割）
	 */
	@RequestMapping("/toExport")
	public String toExport(String id) {
		request.setAttribute("id",id);
		return "cargo/export/export-toExport";
	}

	/**
	 * 新增或者修改报运单
	 *      参数：export
	 *          对于更新来说：
	 *              包含了报运单的主体信息
	 *              包含了页面上修改的报运单商品的列表数据 ：exportProducts属性列表
	 */
	@RequestMapping("/edit")
	public String edit(Export export) {
		//1.设置租户数据（基本信息）
		export.setCompanyId(getLoginCompanyId());
		export.setCompanyName(getLoginCompanyName());

		//2.判断参数中是否具有id
		if(StringUtils.isEmpty(export.getId())) {
			//2.1 如果没有id，保存
			exportService.save(export);
		}else{
			//2.2 有id，更新
			exportService.update(export);
		}
		//3.重定向到列表
		return "redirect:/cargo/export/list.do";
	}

	/**
	 * 进入修改页面
	 *  参数:报运单id
	 */
	@RequestMapping("/toUpdate")
	public String toUpdate(String id) {
		//1.根据id查询报运单
		Export export = exportService.findById(id);
		request.setAttribute("export",export);
		//2.根据报运单id，查询报运单下的所有商品(ExportId)
		ExportProductExample example = new ExportProductExample();
		ExportProductExample.Criteria criteria = example.createCriteria();
		criteria.andExportIdEqualTo(id);
		List<ExportProduct> list = exportProductService.findAll(example);
		request.setAttribute("eps",list);

		//跳转页面
		return "cargo/export/export-update";
	}

	//提交
	@RequestMapping("/submit")
	public String submit(String id){
		//将对象的状态由 0 -- > 1
		Export export = new Export();
		export.setId(id);
		export.setState(1);
		exportService.update(export);
		return "redirect:/cargo/export/list.do";
	}

	/**
	 * 电子保运
	 *      参数：当前勾选的报运单ID
	 */
	@RequestMapping("/exportE")
	public String exportE(String id) {
		//i.将数据发送到海关平台
		//1.根据id查询报运单对象 Export
		Export export = exportService.findById(id);
		//2.根据报运单ID查询报运单商品对象 ExportProduct
		ExportProductExample example = new ExportProductExample();
		ExportProductExample.Criteria criteria = example.createCriteria();
		criteria.andExportIdEqualTo(id);
		List<ExportProduct> list = exportProductService.findAll(example);
		//3.根据报运单对象转化为报运单VO对象  （export-->exportVo）
		ExportVo evo = new ExportVo(); //正式企业开发，需要set进去（没有规律）
		BeanUtils.copyProperties(export,evo);
		evo.setExportId(export.getId());
		//4.根据报运单商品转化为保运商品vo对象
		List<ExportProductVo> epvos = new ArrayList();
		for (ExportProduct ep : list) {
			ExportProductVo epvo = new ExportProductVo();
			BeanUtils.copyProperties(ep,epvo);
			epvo.setExportProductId(ep.getId());
			epvo.setEid(id);
			epvos.add(epvo);
		}
		//5.设置报运单vo和商品vo的关系，为了方便数据传输，在报运单中设置一个商品的list属性
		evo.setProducts(epvos);
		//6.通过WebClient工具类发送请求到海关
		WebClient wc = WebClient.create("http://localhost:9090/ws/export/user");
		wc.post(evo);
		//ii.从海关平台查询报运结果数据
		wc = WebClient.create("http://localhost:9090/ws/export/user/"+id); //根据保运单id查询
		ExportResult result = wc.get(ExportResult.class);
		//iii.将报运单结果更新到数据库中
		exportService.updateE(result);
		return "redirect:/cargo/export/list.do";
	}
}

